package com.ruoyi.iot.service;

import com.ruoyi.iot.domain.enums.DeviceTimeScope;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 主机设备能耗与运行指标服务。
 */
public interface HostDeviceMetricsService {

    /**
     * 查询所有主机柜及其开关柜信息。
     *
     * @return 主机柜集合
     */
    List<Map<String, Object>> queryAllMainCabinetMetrics();

    String findDeviceKgIdByDeviceId(String deviceId);

    String findDeviceIdByDeviceKgId(String deviceKgId);

    /**
     * 统计指定主机开关柜在给定时间范围内的有功功率累积（kW）。
     *
     * @param deviceKgId 主机开关柜编号
     * @param scope      统计区间
     * @return 有功功率累计值
     */
    BigDecimal queryTotalActivePower(String deviceKgId, DeviceTimeScope scope);

    /**
     * 统计指定主机开关柜在给定时间范围内的无功功率累积（kVar）。
     *
     * @param deviceKgId 主机开关柜编号
     * @param scope      统计区间
     * @return 无功功率累计值
     */
    BigDecimal queryTotalReactivePower(String deviceKgId, DeviceTimeScope scope);

    /**
     * 统计指定主机开关柜在给定时间范围内的有功电量（kWh）。
     *
     * @param deviceKgId 主机开关柜编号
     * @param scope      统计区间
     * @return 有功电量
     */
    BigDecimal queryTotalActiveEnergy(String deviceKgId, DeviceTimeScope scope);

    /**
     * 查询指定主机开关柜在给定时间范围内的运行时长趋势（小时）。
     *
     * @param deviceKgId 主机开关柜编号
     * @param scope      统计区间
     * @return 时间桶与对应运行时长集合
     */
    List<Map<String, Object>> queryRuntimeTrend(String deviceKgId, DeviceTimeScope scope);

    /**
     * 查询主机设备最新一条实时参数记录。
     *
     * @param deviceId 主机设备编号
     * @return 最新参数键值集合
     */
    List<Map<String, Object>> queryLatestRecord(String deviceId);

    /**
     * 聚合主机开关柜本日/本月/本年等区间的用电量（kWh）。
     *
     * @param deviceKgId 主机开关柜编号
     * @return 各统计区间的用电量汇总
     */
    List<Map<String, Object>> queryActiveEnergySummary(String deviceKgId, DeviceTimeScope scope);

    /**
     * 统计主机开关柜在指定区间内的累计运行时长（小时）。
     *
     * @param deviceKgId 主机开关柜编号
     * @param scope      统计区间
     * @return 运行时长，未命中数据时返回 0
     */
    BigDecimal queryTotalRuntimeHours(String deviceKgId, DeviceTimeScope scope);

    /**
     * 查询主机设备在指定时间范围内的故障记录（需先设置分页）。
     *
     * @param deviceId 主机设备编号
     * @param scope    统计区间
     * @return 故障记录列表
     */
    List<Map<String, Object>> queryFaultRecords(String deviceId, DeviceTimeScope scope);
    /**
     * 分页查询开关柜电参与主机温度数据，并将两类字段在每条记录中合并展示。
     *
     * @param deviceKgId 开关柜设备编号
     * @param scope      查询时间范围（仅支持本日、本月、本年度）
     * @param pageNum    页码，默认为1
     * @param pageSize   每页条数，默认为10
     * @return 包含分页信息及组合记录的结构化结果
     */
    Map<String, Object> queryCombinedDeviceSnapshots(String deviceKgId, DeviceTimeScope scope,
                                                     Integer pageNum, Integer pageSize,
                                                     LocalDateTime startTime, LocalDateTime endTime);


    /**
     * 查询主机设备在给定时间范围内的健康评分趋势。
     *
     * @param deviceId 主机设备编号
     * @param scope    统计区间
     * @return 时间桶与综合评分集合
     */
    List<Map<String, Object>> queryHealthScoreHistory(String deviceId, DeviceTimeScope scope);

    /**
     * 统计主机温度字段在指定时间范围内的最高/最低/平均值，并返回可直接展示的文本描述。
     *
     * @param deviceId 主机设备编号
     * @param scope    查询时间范围（仅支持本日、本月、本年度）
     * @return 温度字段与对应统计结果列表
     */
    List<Map<String, Object>> queryDeviceTemperatureStats(String deviceId, DeviceTimeScope scope,
                                                          LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询主机温度字段在指定范围内的趋势数据（本日按小时、本月按天、本年度按月聚合）。
     *
     * @param deviceId 主机设备编号
     * @param scope    查询时间范围（仅支持本日、本月、本年度）
     * @return 每个时间桶对应的温度字段集合
     */
    List<Map<String, Object>> queryDeviceTemperatureTrend(String deviceId, DeviceTimeScope scope,
                                                          LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询主机设备最新健康评分。
     *
     * @param deviceId 主机设备编号
     * @return 最新健康评分字段
     */
    Map<String, Object> queryLatestHealthScore(String deviceId);

    /**
     * 汇总全部主机在指定范围内的运行时长、功率及用电量（合计视图）。
     *
     * @param scope 统计区间，仅支持本日、本月、本年度
     * @return 包含合计指标的键值对
     */
    Map<String, Object> aggregateHostMetrics(DeviceTimeScope scope);

    /**
     * 查询全部主机在指定范围内是否运行过（isPowerOnPos=1视为已运行）�?
     *
     * @param scope 统计区间，仅支持本日、本月、本年度
     * @return 主机列表及运行标记
     */
    List<Map<String, Object>> queryHostRunStatus(DeviceTimeScope scope);

    /**
     * 分页查询主机运行报表（按主机汇总运行状态、功率、能耗等）。
     *
     * @param scope      统计区间，仅支持本日、本月、本年度
     * @param deviceKgId 可选，指定开关柜编号，不传则查询全部主机
     * @return 主机运行报表数据列表
     */
    List<Map<String, Object>> queryHostOperationReport(DeviceTimeScope scope, String deviceKgId);
}
